<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	/**
	 * 实现Promise.allSettled方法，返回一个Promise，该Promise在所有给定的Promise已被决议（fulfilled或rejected）后决议
	 * @param {Array} promises - 待处理的Promise数组
	 * @returns {Promise} 返回新的Promise，其决议值为包含所有Promise状态和结果的对象数组
	 */
	function promiseAllSettled(promises){
		return new Promise((resolve) => {
			let count = 0
			let result = []

			// 处理空数组情况
			if (promises.length === 0){
				resolve(result)
			}

			// 初始化结果数组（确保长度与输入一致）
			result = new Array(promises.length)

			// 遍历处理每个Promise
			for(let i = 0; i < promises.length; i++){
				// 将当前值转为Promise确保统一处理
				Promise.resolve(promises[i]).then(
						// 成功处理：记录履行状态和值
						value => {
							result[i] = {status: 'fulfilled', value}
						},
						// 失败处理：记录拒绝状态和原因
						reason => {
							result[i] = {status: 'rejected', reason}
						}
				).finally(()=>{
					// 计数器更新：无论成功失败都计数
					count++

					// 当所有Promise都完成时决议结果
					if (count === promises.length){
						resolve(result)
					}
				})
			}
		})
	}
	
	// 测试用例1: 混合成功/失败
	promiseAllSettled([
		Promise.resolve(1),
		Promise.reject('error'),
		Promise.resolve(3)
	]).then(console.log);
	// 预期输出包含3个对象，其中第二个status为rejected
	
	// 测试用例2: 空数组
	promiseAllSettled([]).then(console.log); // 预期立即返回空数组
	
	// 测试用例3: 非Promise值
	promiseAllSettled([42, 'test']).then(console.log);
	// 预期两个fulfilled状态对象
	
	// 测试用例4: 立即拒绝
	promiseAllSettled([Promise.reject(new Error('fail'))])
		.then(console.log); // 预期包含一个rejected状态对象

</script>
</html>